package com.itmk.web.fee_park.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itmk.utils.ResultUtils;
import com.itmk.utils.ResultVo;
import com.itmk.web.fee_park.entity.FeePark;
import com.itmk.web.fee_park.entity.FeeParkParm;
import com.itmk.web.fee_park.service.FeeParkService;
import com.itmk.web.live_park.entity.LivePark;
import com.itmk.web.live_park.mapper.LiveParkMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * 停车费模块控制器
 * 负责处理与停车费相关的HTTP请求
 */
@RestController
@RequestMapping("/api/feePark")
public class FeeParkController {

    @Autowired
    private FeeParkService feeParkService; // 停车费服务层

    @Resource
    private LiveParkMapper liveParkMapper; // 车位使用情况Mapper

    /**
     * 查询我的停车费
     * @param feeParkParm 查询参数，包含用户ID、分页信息等
     * @return 返回分页查询结果
     */
    @GetMapping("/getMyParkFee")
    public ResultVo getMyParkFee(FeeParkParm feeParkParm) {
        // 构造分页对象
        IPage<FeePark> page = new Page<>();
        page.setCurrent(feeParkParm.getCurrentPage()); // 设置当前页
        page.setSize(feeParkParm.getPageSize()); // 设置每页大小
        // 构造查询条件
        QueryWrapper<FeePark> query = new QueryWrapper<>();
        query.lambda().eq(FeePark::getUserId, feeParkParm.getUserId()); // 根据用户ID查询
        IPage<FeePark> list = feeParkService.page(page, query); // 执行分页查询
        return ResultUtils.success("查询成功", list); // 返回查询结果
    }

    /**
     * 新增停车费记录
     * 1. 查询当前正在使用车位的用户
     * 2. 将停车费记录入库
     * @param feePark 停车费实体对象
     * @return 返回操作结果
     */
    @PreAuthorize("hasAuthority('sys:feePark:add')") // 权限校验，只有具有添加权限的用户可以访问
    @PostMapping
    public ResultVo add(@RequestBody FeePark feePark) {
        // 1. 查询当前正在使用车位的租户
        QueryWrapper<LivePark> query = new QueryWrapper<>();
        query.lambda().eq(LivePark::getParkId, feePark.getParkId()) // 根据车位ID查询
                .eq(LivePark::getLiveStatue, "0"); // 查询状态为“使用中”的记录
        LivePark livePark = liveParkMapper.selectOne(query); // 执行查询
        if (livePark == null) {
            return ResultUtils.error("该车位暂无人员使用!"); // 如果车位未被使用，返回错误信息
        }
        feePark.setUserId(livePark.getUserId()); // 设置用户ID
        // 2. 将停车费记录入库
        boolean save = feeParkService.save(feePark); // 执行保存操作
        if (save) {
            return ResultUtils.success("新增停车费成功!"); // 保存成功，返回成功信息
        }
        return ResultUtils.error("新增停车费失败!"); // 保存失败，返回错误信息
    }

    /**
     * 编辑停车费记录
     * 1. 查询当前正在使用车位的用户
     * 2. 更新停车费记录
     * @param feePark 停车费实体对象
     * @return 返回操作结果
     */
    @PutMapping
    @PreAuthorize("hasAuthority('sys:feePark:edit')") // 权限校验，只有具有编辑权限的用户可以访问
    public ResultVo edit(@RequestBody FeePark feePark) {
        // 1. 查询当前正在使用车位的租户
        QueryWrapper<LivePark> query = new QueryWrapper<>();
        query.lambda().eq(LivePark::getParkId, feePark.getParkId()) // 根据车位ID查询
                .eq(LivePark::getLiveStatue, "0"); // 查询状态为“使用中”的记录
        LivePark livePark = liveParkMapper.selectOne(query); // 执行查询
        if (livePark == null) {
            return ResultUtils.error("该车位暂无人员使用!"); // 如果车位未被使用，返回错误信息
        }
        feePark.setUserId(livePark.getUserId()); // 设置用户ID
        // 2. 更新停车费记录
        boolean b = feeParkService.updateById(feePark); // 执行更新操作
        if (b) {
            return ResultUtils.success("编辑停车费成功!"); // 更新成功，返回成功信息
        }
        return ResultUtils.error("编辑停车费失败!"); // 更新失败，返回错误信息
    }

    /**
     * 删除停车费记录
     * 1. 判断是否已经缴费，如果已缴费则不能删除
     * 2. 执行删除操作
     * @param parkFeeId 停车费记录ID
     * @return 返回操作结果
     */
    @PreAuthorize("hasAuthority('sys:feePark:delete')") // 权限校验，只有具有删除权限的用户可以访问
    @DeleteMapping("/{parkFeeId}")
    public ResultVo delete(@PathVariable("parkFeeId") Long parkFeeId) {
        // 1. 判断是否已经缴费，根据ID查询缴费状态
        QueryWrapper<FeePark> query = new QueryWrapper<>();
        query.lambda().eq(FeePark::getParkFeeId, parkFeeId); // 根据停车费ID查询
        FeePark one = feeParkService.getOne(query); // 执行查询
        if (one == null) {
            return ResultUtils.error("删除失败，请检查信息是否正确!"); // 如果记录不存在，返回错误信息
        }
        // 2. 执行删除操作
        boolean b = feeParkService.removeById(parkFeeId); // 执行删除操作
        if (b) {
            return ResultUtils.success("删除停车费成功!"); // 删除成功，返回成功信息
        }
        return ResultUtils.error("删除停车费失败!"); // 删除失败，返回错误信息
    }

    /**
     * 缴费操作
     * 将当前记录的 payParkStatus 设为1（已缴费）
     * @param feePark 停车费实体对象
     * @return 返回操作结果
     */
    @PostMapping("/pay")
    public ResultVo pay(@RequestBody FeePark feePark) {
        // 把状态设为1（已缴费）
        feePark.setPayParkStatus("1");
        boolean b = feeParkService.updateById(feePark); // 执行更新操作
        if (b) {
            return ResultUtils.success("缴费成功!"); // 缴费成功，返回成功信息
        }
        return ResultUtils.error("缴费失败!"); // 缴费失败，返回错误信息
    }

    /**
     * 查询停车费列表
     * @param feeParkParm 查询参数，包含分页信息等
     * @return 返回分页查询结果
     */
    @GetMapping("/list")
    public ResultVo getList(FeeParkParm feeParkParm) {
        IPage<FeePark> list = feeParkService.getList(feeParkParm); // 执行分页查询
        return ResultUtils.success("查询成功", list); // 返回查询结果
    }
}
